<?php
namespace App\Core\Entity\Session;

class UserEntity extends Factory
{

    /**
     * 用户数据内部 key（重定向地址）
     */
    const KEY_REDIRECT_URI = 'redirect_uri';

    public function __construct(array $data = [])
    {
        if (! count($data) && session()->has(self::SESSION_KEY_USER)) {
            $data = session()->get(self::SESSION_KEY_USER);
        }
        parent::__construct($data);
    }

    /**
     * 验证用户是否登录
     *
     * @return boolean
     */
    public function isValid()
    {
        return $this->offsetExists('id');
    }

    /**
     * 获取用户ID
     *
     * @return NULL | id
     */
    public function getUserId()
    {
        return $this->isValid() ? $this->offsetGet('id') : null;
    }

    /**
     * 获取用户数据
     *
     * @return array
     */
    public function getUser()
    {
        return $this->isValid() ? $this->getArrayCopy() : [];
    }

    /**
     * 获取登录地址
     *
     * @return string uri
     */
    public function getSignInUri()
    {
        return route('user.signIn');
    }

    /**
     * 获取注册地址
     *
     * @return string uri
     */
    public function getSignUpUri()
    {
        return route('user.signUp');
    }

    /**
     * 获取退出地址
     *
     * @return string uri
     */
    public function getSignOutUri()
    {
        return route('user.signOut');
    }

    /**
     * 获取 redirect 链接
     *
     * @return string
     */
    public function getRedirectUri()
    {
        $redirect_uri = $this->offsetExists(self::KEY_REDIRECT_URI) ? $this->offsetGet(self::KEY_REDIRECT_URI) : false;
        if (! $redirect_uri) {
            $redirect_uri = empty($_SERVER['HTTP_REFERER']) ? route('index') : $_SERVER['HTTP_REFERER'];
        }
        return $redirect_uri;
    }

    /**
     * 保存 redirect 链接
     *
     * @param string $redirect_uri            
     * @return $this
     */
    public function setRedirectUri($redirect_uri)
    {
        $this->offsetSet(self::KEY_REDIRECT_URI, $redirect_uri);
        return $this;
    }

    /**
     * 删除 redirect 链接
     *
     * @return $this
     */
    public function unsetRedirectUri()
    {
        if ($this->offsetExists(self::KEY_REDIRECT_URI)) {
            $this->offsetUnset(self::KEY_REDIRECT_URI);
        }
        return $this;
    }

    public function save()
    {
        if ($this->count()) {
            // 保存数据到 session
            session()->put(self::SESSION_KEY_USER, $this->getArrayCopy());
        } else {
            // 删除数据到 session
            session()->forget(self::SESSION_KEY_USER);
        }
    }

    /**
     * 析构函数，同步数据到 session
     */
    public function __destruct()
    {
        $this->save();
    }
}